<?php
declare(strict_types=1);
namespace Haozing\Core\Service;

abstract class BaseService implements IBaseService
{
    protected mixed $model;
    
    abstract function setModel(): void;

    public function __construct()
    {
        $this->setModel();
    }

    /**
     * 查询分类表单条数据 - 根据ID
     * @param int $id ID
     * @param string[] $field 查询字段
     * @return array
     */
    public function getOneById(int $id, array $field = ['*']): array
    {
        return $this->model->getOneById($id, $field);
    }

    /**
     * 查询分类表单条数据 - 根据条件
     * @param array $where 条件
     * @param string[] $field 查询字段
     * @param array $options
     * @return array
     */
    public function getOneByWhere(array $where, array $field = ['*'], array $options = []): array
    {
        return $this->model->getOneByWhere($where, $field,$options);
    }

    /**
     * 查询分类表多条数据 - 根据ID
     * @param array $ids ID
     * @param string[] $field 查询字段
     * @return array
     */
    public function getManyByIds(array $ids, array $field = ['*']): array
    {
        return $this->model->getListByWhereIn($ids, $field);
    }

    /**
     * 查询分类表多条数据 - 根据条件
     * @param array $where 条件
     * @param string[] $field 查询字段
     * @param array $options
     * @param int $limit
     * @return array
     */
    public function getManyByWhere(array $where, array $field = ['*'], array $options = [], int $limit = 1000): array
    {
        return $this->model->getListByWhere($where, $field,$options, $limit);
    }

    /**
     * 查询分类表分页数据 - 根据条件
     * @param array $where 条件
     * @param string[] $field 查询字段
     * @param array $options
     * @return array
     */
    public function getPage(array $where, array $field = ['*'],array $options = []): array
    {
        return $this->model->getPageByWhere($where, $field, $options);
    }

    /**
     * 添加分类表单条数据
     * @param array $data 添加数据
     * @return int 自增ID
     */
    public function addOne(array $data): int
    {
        return $this->model->addOne($data);
    }

    /**
     * 添加分类表多条数据
     * @param array $data 添加数据
     * @return bool 操作结果
     */
    public function addMany(array $data): bool
    {
        return $this->model->addAll($data);
    }

    /**
     * 修改分类表单条数据 - 根据ID
     * @param int $id ID
     * @param array $data 修改数据
     * @return int 修改条数
     */
    public function updateById(int $id, array $data): int
    {
        return $this->model->updateOneById($id, $data);
    }

    /**
     * 修改分类表单条数据 - 根据条件
     * @param array $where 条件
     * @param array $data 修改数据
     * @param array $options 修改选项
     * @return int 修改条数
     */
    public function updateByWhere(array $where, array $data,array $options=[]): int
    {
        return $this->model->updateByWhere($where, $data,$options);
    }

    /**
     * 删除分类表单条数据 - 根据ID
     * @param int $id ID
     * @return int 删除条数
     */
    public function deleteById(int $id): int
    {
        return $this->model->deleteOneById($id);
    }

    /**
     * 删除分类表多条数据 - 根据ID
     * @param array $ids ID
     * @return int 删除条数
     */
    public function deleteManyByIds(array $ids): int
    {
        return $this->model->deleteAllById($ids);
    }

    /**
     * 删除分类表数据 - 根据条件
     * @param array $where 条件
     * @return int 删除条数
     */
    public function deleteByWhere(array $where,array $options =[]): int
    {
        return $this->model->deleteByWhere($where,$options);
    }

    /**
     * 批量修改 - 根据ID
     * @param array $data 修改数据 `[['id'=>1, 'name' => 'name1'], ['id' => 2, 'name' => 'name2']]`
     * @return int 修改条数
     */
    public function updateMany(array $data): int
    {
        return $this->model->batchUpdateByIds($data);
    }

}